package com.ruoyi.water.service;


import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.water.domain.dto.ApiResponse;
import com.ruoyi.water.domain.dto.WaterMeterDataDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

@Service
@Slf4j
public class WaterMeterDataService {

    @Autowired
    private WaterTokenService waterTokenService;

    @Autowired
    private RestTemplate restTemplate;

    /** 节能平台基础 URL（文档 3 节：http://IP:端口/plat） */
    @Value("${energy.api.base-url:}")
    private String energyBaseUrl;

    /** 节能平台 4.3 接口路径（文档 4.3.1：/datacenter/data/findByCondition） */
    private static final String ENERGY_API_PATH = "/datacenter/data/findByCondition";

    /**
     * 原封不动传递 QueryParams 调用节能平台 4.3 接口
     * @param rawQueryParams 前端传来的原始 QueryParams（未修改）
     * @return 节能平台原始响应
     */
    public ApiResponse<List<WaterMeterDataDTO>> callEnergyPlatformRaw(String rawQueryParams) {
        try {
            // 1. 获取Token、构建URL、请求头（代码不变，复用之前逻辑）
            String accessToken = waterTokenService.getEffectiveAccessToken();
            String fullEnergyUrl = energyBaseUrl + ENERGY_API_PATH + "?" + rawQueryParams;
            log.info("传给节能平台的完整 URL：{}", fullEnergyUrl);

            // 2. 构建请求头（不变）
            HttpHeaders headers = new HttpHeaders();
            headers.add("Cookie", "Authorization=" + accessToken);
            HttpEntity<Void> requestEntity = new HttpEntity<>(headers);

            // 3. 关键修改：响应类型改为 ApiResponse<List<WaterMeterDataDTO>>
            ResponseEntity<ApiResponse<List<WaterMeterDataDTO>>> response = restTemplate.exchange(
                    new URI(fullEnergyUrl),
                    HttpMethod.GET,
                    requestEntity,
                    // 正确的泛型类型：匹配实际返回的 data=List<WaterMeterDataDTO>
                    new ParameterizedTypeReference<ApiResponse<List<WaterMeterDataDTO>>>() {}
            );

            // 4. 响应校验（不变，仅调整返回类型）
            if (!response.getStatusCode().is2xxSuccessful()) {
                throw new ServiceException("节能平台返回 HTTP 错误：" + response.getStatusCode());
            }
            ApiResponse<List<WaterMeterDataDTO>> energyResp = response.getBody();
            if (energyResp == null || !Boolean.TRUE.equals(energyResp.getSuccess())) {
                throw new ServiceException("节能平台业务失败：" + (energyResp != null ? energyResp.getMessage() : "无响应"));
            }

            // 5. 打印解析成功的日志（验证数据）
            log.info("节能平台数据解析成功！总条数：{}，数据条数：{}",
                    energyResp.getTotal(),
                    energyResp.getData() != null ? energyResp.getData().size() : 0);
            return energyResp;

        } catch (Exception e) {
            log.error("调用节能平台异常：", e);
            throw new ServiceException("调用节能平台 HTTP 异常：" + e.getMessage());
        }
    }

    /** 隐藏 Token 敏感信息（日志安全） */
    private String hideToken(String token) {
        return token == null || token.length() <= 8 ? "******" : token.substring(0, 4) + "******" + token.substring(token.length() - 4);
    }
}